# -*- coding:UTF-8 -*-
'''
开发环境：PyCharm
创建日期：2025/8/6 10:42
作   者：新启典学苑-樱桃
描   述：selenium 8种定位元素的方式
        css 选择器
         标签选择器：标签名   input   a   img
         ID选择器： #id
         类选择器：.类名
         标签+ID选择器：  input#kw
         标签+类选择器：input.s_ipt
         属性选择器：  [属性名1=属性值1][属性名2=属性值2]
         标签+属性选择器：input[属性名1=属性值1][属性名2=属性值2]

         支持模糊匹配：
              属性以xx开头， [属性^=值]
              属性以xx结尾：[属性$=值]
              属性包含xx： [属性*=值]

         子元素选择器：父元素与子元素之间的层级关系。  > 表示层级。
              html > body > div > h1
              #s-top-left > a:nth-child(3)
                   nth-child(n) 第n个孩子
                   nth-child(1)、  first-child 第1个孩子
                   last-child 最后一个孩子

        怎么选择定位元素的方式？
            如果有id、name，优先使用id、name来定位。
            如果没有id、name、要定位的是a标签，可以用link text、 partial link text定位。
            如果上述都不行，再选择用css 来定位。
            最终选择用xpath定位。css比xpath效率高。

        面试题：selenium定位元素的方式有哪些？你在写脚本时常用的哪些方式？
              定位元素的时候，使用id、使用xpath有什么区别？
              使用xpath与css有什么区别？
'''
from time import sleep

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Edge()  # 创建edge浏览器对象
driver.get("http://www.baidu.com")  # 访问百度

# 定位所有的a标签
es = driver.find_elements(By.CSS_SELECTOR, "a")
print(len(es))
# 定位百度搜索输入框
e = driver.find_element(By.CSS_SELECTOR, "#kw")
e.send_keys("css 选择器是什么")
e = driver.find_element(By.CSS_SELECTOR, "input.s_ipt")
e.send_keys("css 选择器是什么")
e.clear()
# 定位百度搜索输入框
e = driver.find_element(By.CSS_SELECTOR, "[autocomplete='off']")
e.send_keys("1")
e = driver.find_element(By.CSS_SELECTOR, "[autocomplete='off'][maxlength='255]")
e.send_keys("2")
e = driver.find_element(By.CSS_SELECTOR, "input[autocomplete='off'][maxlength='255]")
e.send_keys("3")
driver.find_element(By.ID, "su").click()
sleep(5)
# 定位百度热搜
e = driver.find_element(By.CSS_SELECTOR, "[title^='百度热']") # 以xx开头
print(e.get_dom_attribute("class"))
e = driver.find_element(By.CSS_SELECTOR, "[title$='热搜']") # 以xx结尾
print(e.get_dom_attribute("class"))
e = driver.find_element(By.CSS_SELECTOR, "[title*='度热']") # 包含xx
print(e.get_dom_attribute("class"))

# 子元素选择器
driver.get("http://www.baidu.com")
sleep(2)
a = driver.find_element(By.CSS_SELECTOR, "#s-top-left > a:nth-child(3)") # 地图
print(a.text)
a = driver.find_element(By.CSS_SELECTOR, "#s-top-left > a:first-child") # 新闻
print(a.text)
a = driver.find_element(By.CSS_SELECTOR, "#s-top-left > div:last-child") # 更多
print(a.get_dom_attribute("class"))